#ifndef GAME_H
#define GAME_H

#include <string>
//#include "loadpng.h"
#include "controlManager.h"

class ActorManager;
class StageManager;
class CollisionManager;

/*La calse game contiene toda la indormacion del juego y
 *delega tareas a los managers.
 */
class Game{
    public:
        /*constructor*/
        Game();
        /*Destructor*/
        virtual ~Game();

        typedef enum
        {
            ALLY,
            ENEMY
        }team_t;

        ActorManager *actor_manager; //Manejador de actores
        StageManager *stage_manager; //manejador de escena
        ControlManager *control_manager; //manejador de controles
        CollisionManager *collision_manager;

        /*Inicializador de la clase, inicia el modo grafico, crea los manejadores e inicia el juego*/
        virtual void init(int gfx_mode, int w, int h, int col);
        /*main del juego, se encarga de mantenerlo funcionando*/
        virtual void main();
        /*Setea el nombre del juego*/
        void set_name(std::string name);
        /*obtiene el nombre del juego*/
        std::string get_name();

    protected:
        std::string name; //nombre del juego
        /*Actualiza el juego, se encarga ademas de controlar la velocidad del juego*/
        void update();

        int gfx_w,gfx_h; //tamaño de la pantalla
        int colors; //colores de la pantalla
    private:
        int graphic_tick, old_tick; //variables para la velicidad del juego
        int actual_tick, frame_skip, max_frame_skip;

        /*Incia el juego*/
        void start();
        /*Libera toda la memoria y cierra allegro*/
        void shutdown(std::string message="Gracias por jugar");
        /*Instancia un manejador de actores*/
        virtual void create_actormanager();
        /*instancia un manejador de escena*/
        virtual void create_stagemanager();
        /*Instancia un manejador de controles*/
        virtual void create_controlmanager();
        /*Instancia un manejador de colisiones*/
        virtual void create_collisionmanager();
        /*Setea el maximo de frames skip*/
        void set_max_frame_skip(int max_fs);
};
#endif
